/**
 * 
 * 
 * 
 */

#include <opencv2/opencv.hpp>
#include <iostream>

// d
// 如何高效的计算原始图像中任意矩形区域的像素和？
// 右下 - 左下 - 右上 + 左上，对于给定的矩形，以上四个值都是已知的
float sumRect(const cv::Mat integral, const cv::Rect rect) {
    return integral.at<float>(rect.height + rect.y, rect.width + rect.x) + integral.at<float>(rect.y, rect.x) - integral.at<float>(rect.height + rect.y, rect.x) - integral.at<float>(rect.y, rect.width + rect.x);
}

// e
// 修改积分图像，使得能够高效的计算原始图像中45度旋转的矩形区域像素和
// 使用极坐标转换？

int main(int argc, char** argv){

    // a 生成随机数填充的矩阵
    cv::Mat mu(200, 100, CV_8UC1);
    cv::RNG rng((unsigned int)(time(NULL)));
    rng.fill(mu, cv::RNG::UNIFORM, 0, 255, false);
    // cv::randu(mu, 0, 255);

    cv::Mat mi(200 ,100, CV_32FC1, cv::Scalar(0));
    cv::imshow("gray", mu);

    cv::Size sz = mu.size();
    std::cout << "w:" << sz.width << ", h:" << sz.height << std::endl;
    
    // b 
    // 定义大小 (row, col)
    // roi选取 (width, height)
    // at访问  (row, col)
    for(int i = 0; i < 200; i++){
        for (int j = 0; j < 100; j++){
            cv::Mat temp = mu(cv::Rect(0,0, j, i));
            float sum = cv::sum(temp)[0];
            mi.at<float>(i, j) = sum;
        }
    }

    // d
    // 如何高效的计算原始图像中任意矩形区域的像素和？
    // 右下 - 左下 - 右上 + 左上，对于给定的矩形，以上四个值都是已知的


    // cv::imshow("sum", mi);
    cv::waitKey(0);
    return 0;
}